import pygame
import time
import random



# 初始化
pygame.init()
# 这里是设置的常量值
FPS = 65
# 游戏的背景颜色
BG_COLOR = pygame.Color(112, 128, 105)
# 屏幕大小
SIZE = pygame.display.list_modes()[0]
SHIJIAN = time.strftime("%Y.%m.%d %H:%M:%S", time.localtime(time.time()))


class MyGame:
    """这是一个游戏的主类"""

    windos = None
    clock = None

    def run_game(self):
        MyGame.windos = pygame.display.set_mode(
            (SIZE[0] / 2, SIZE[1] / 2), flags=pygame.RESIZABLE
        )
        # 设置屏幕的刷新
        MyGame.clock = pygame.time.Clock()

        # 创建我们的坦克
        tk = MyTank()

        # 创建地方坦克 创建10个
        ai_tank = [AlTank() for i in range(20)]

        while 1:
            """需要循环执行的代码"""
            # 游戏的帧率
            MyGame.clock.tick(FPS)
            # 这个是刷新率
            r = MyGame.clock.get_fps()
            # 这个是标题
            pygame.display.set_caption(f"坦克大战1.0\t\t{SHIJIAN}\t\t\t\t\tfps:{r:.2f}")

            # 这个是背景颜色
            MyGame.windos.fill(BG_COLOR)
            # 这个是获取窗口的位置
            MyGame.windos.get_rect()

            # 实现我们窗口最大化最小化 可以关闭窗口
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
                elif event.type == pygame.KEYDOWN:
                    # print('您按下了按键') 5
                    tk.update_key_down(event.key)
                elif event.type == pygame.KEYUP:
                    # print('您松开了按键')
                    tk.update_key_up(event.key)

            # 这个是绘制我们的坦克
            tk.tank_move()
            # 移动我们坦克
            tk.draw(MyGame.windos)

            # 移动并绘制敌方坦克
            for enemy_tank in ai_tank:
                enemy_tank.etank_move()
                enemy_tank.draw(MyGame.windos)
            # 这个是刷新
            pygame.display.update()


class MyTank:
    """这个是我的坦克"""

    def __init__(self):

        # 设置我方坦克资源，用字典方式存储下来
        self.images = {
            "U": pygame.image.load("./imag/myTankU.gif"),  # up  上
            "D": pygame.image.load("./imag/myTankD.gif"),  # down 下
            "L": pygame.image.load("./imag/myTankL.gif"),  # litf 左
            "R": pygame.image.load("./imag/myTankR.gif"),  # right 右
        }
        # 设置我方坦克反向
        self.fangxiang = "U"
        # 获取图片信息  这是默认的方向  #字典的获取方法 字典的键作为开关，值作为随机值
        self.image = self.images.get(self.fangxiang)
        self.rect = self.image.get_rect()  # 这一步是获取了坦克的全部尺寸

        # 绘制我方坦克的位置  获取窗口位置  设置我们坦克的位置
        MyGame.windos1 = MyGame.windos.get_rect()
        self.rect.centerx = MyGame.windos1.centerx
        self.rect.centery = MyGame.windos1.centery + 200

        # 2,设置我们坦克 移动步长和速度
        self.speed = 2
        self.sudu = 5

        # 设置我们坦克的方向

        # 设置开关
        self.move_up = False
        self.move_down = False
        self.move_left = False
        self.move_right = False

    def draw(self, surface):
        """这是绘制我们坦克的方法"""
        self.image = self.images.get(self.fangxiang)
        surface.blit(self.image, self.rect)

    # 3,编写我们按键的方法  按下去之后为True
    def update_key_down(self, key):
        if key == pygame.K_UP or key == pygame.K_w:
            self.move_up = True
            print("按了上键")
            # 修改我们坦克的方向
            self.fangxiang = "U"

        elif key == pygame.K_DOWN or key == pygame.K_s:
            self.move_down = True
            print("按了下键")
            # 修改坦克的方向
            self.fangxiang = "D"

        elif key == pygame.K_LEFT or key == pygame.K_a:
            self.move_left = True
            print("按了左键")
            # 修改坦克的方向
            self.fangxiang = "L"

        elif key == pygame.K_RIGHT or key == pygame.K_d:
            self.move_right = True
            print("按了右键")
            # 修改坦克的方向
            self.fangxiang = "R"

    # 4,松开按键之后为False
    def update_key_up(self, key):
        if key == pygame.K_UP or key == pygame.K_w:
            self.move_up = False
  
        elif key == pygame.K_DOWN or key == pygame.K_s:
            self.move_down = False

        elif key == pygame.K_LEFT or key == pygame.K_a:
            self.move_left = False
 
        elif key == pygame.K_RIGHT or key == pygame.K_d:
            self.move_right = False


    def tank_move(self):
        """这是坦克移动的方法"""
        if not self.move_up and not self.move_down and not self.move_left and not self.move_right:
            return
        if self.fangxiang=='U' and self.move_up and self.rect.top>0 :#往上  #到边界后就不在移动
            self.rect.centery = self.rect.centery - self.speed * self.sudu

        if self.fangxiang == 'D' and self.rect.bottom < MyGame.windos1.bottom:  # 往下  #到边界后就不在移动
            self.rect.centery = self.rect.centery + self.speed * self.sudu

        if self.fangxiang == 'L'  and self.rect.left>0:  # 往左  #到边界后就不在移动
            self.rect.centerx = self.rect.centerx - self.speed * self.sudu

        if self.fangxiang=='R'  and self.rect.right < MyGame.windos1.right:#往右  #到边界后就不在移动
            self.rect.centerx = self.rect.centerx + self.speed * self.sudu


class AlTank:
    '''这个是地方坦克'''

    def __init__(self):
        # 加载电脑的坦克
        self.images = {
            "U": pygame.image.load("./imag/TankU.gif"),  # up  上
            "D": pygame.image.load("./imag/TankD.gif"),  # down 下
            "L": pygame.image.load("./imag/TankL.gif"),  # litf 左
            "R": pygame.image.load("./imag/TankR.gif"),  # right 右
        }

        # 设置敌方坦克出身方向 随机
        self.fangxiang = self.ran_fangxiang()
        # 获取图片信息  这是默认的方向  #字典的获取方法 字典的键作为开关，值作为随机值
        self.image = self.images.get(self.fangxiang)
        self.rect = self.image.get_rect()  # 这一步是获取了坦克的全部尺寸

        # 确定敌方坦克在屏幕上的位置
        self.top=MyGame.windos1.top+20    #从最上面一排刷新  屏幕的最上面尺寸+坦克高度的一半
        self.left = random.randint(0, int(SIZE[1]))  # 屏幕的宽度和0之间随机值刷新坦克
        self.rect.centerx = self.left  # 敌方坦克的中心x横轴坐标
        self.rect.centery = self.top  # 敌方坦克的中心y纵轴坐标

        # 初始步长  每一个电脑循环的步长
        self.step = 40

    def ran_fangxiang(self):
        '''编写一个获取随机方向的函数'''
        a=random.randint(1,4)
        if a==1:return 'U'
        if a==2:return 'L'
        if a==3:return 'R'
        if a==4:return 'D'

    def etank_move(self):
        '''
        随机移动
        '''
        # 判断步长是否为0
        if self.step <= 0:
            # 如果小于0,更换方向
            self.fangxiang = self.ran_fangxiang()
            # 重置步长
            self.step = 40
        else:
            # 如果大于0,移动
            self.tank_move()
            # 步长减1
            self.step =self.step-1
    def tank_move(self):
        # 根据当前方向移动敌方坦克
        if self.fangxiang == 'U' and self.rect.top > 0:
            self.rect.centery -= 1
        if self.fangxiang == 'D' and self.rect.bottom < MyGame.windos1.bottom:
            self.rect.centery += 1
        if self.fangxiang == 'L' and self.rect.left > 0:
            self.rect.centerx -= 1
        if self.fangxiang == 'R' and self.rect.right < MyGame.windos1.right:
            self.rect.centerx += 1

    def draw(self, surface):
        ''' 绘制坦克到桌布'''
        self.image = self.images.get(self.fangxiang)
        surface.blit(self.image, self.rect)




if __name__ == "__main__":
    MyGame().run_game()
